linux中的core dump调试与运用详解

您所在的位置:网站首页 linux core dumped linux中的core dump调试与运用详解

linux中的core dump调试与运用详解

2022-03-27 07:00| 来源: 网络整理| 查看: 265

缘起

调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。

从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志,这会让你不知所措。

今天给大家介绍一个 core 文件,用这个文件,我们可以找出对应出错的代码行,感觉是不是很神奇。

透着树荫看着朦胧的太阳,晒着日光浴,感觉还不错。先学完这篇,我们再去欣赏风景。

什么是core dump

对于程序,由于各种异常或者 bug,导致在运行过程中,并且在满足一定条件下,产生一个叫做 core 的文件。

通常情况下,core 文件会包含了,程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等。

许多程序出错的时候,会产生一个 core 文件。通过工具分析这个文件,我们可以定位到,程序异常退出的时候对应的堆栈调用等信息。

打开 core dump 开关:ulimit -c unlimited

看一段有问题的代码:

#include《stdio.h》

int main()

{

int *p=NULL;

*p=0;

printf(“bad

”);

return 0;

}

linux下编译和执行:

[root@VM-16-9-c++entos c++]# g++ -g main.cpp

[root@VM-16-9-centos c++]# 。/a.out

Segmentation fault (core dumped)

[root@VM-16-9-centos c++]# ls

a.out core.1989 main.cpp

上述代码一看就有错误,执行会产生 core dump。但是在大型项目中,用肉眼就很难看了。下面说明一下 linux 下调试 core dump 方法。

dmesg+addr2line调试

先介绍 2 个 linux 命令:

dmesg ,一种程序,用于检测和控制内核缓冲。程序用来帮助用户,了解系统的启动信息,可以获得出错堆栈地址。

addr2line ,可以将指令的地址和可执行映像转换成文件名,函数名或源代码的工具。这种功能将跟踪地址转换成更有意义的内容来说很有用。

在调用 addr2line 工具时,要使用 -e 选项来指定可执行映像,使用 -f 选项可以告诉工具输出函数名。

linux下操作过程:

[root@VM-16-9-centos c++]# dmesg | grep a.out

[ 212.330289] a.out[1946]: segfault at 0 ip 0000000000400571 sp 00007ffdf0aafbb0 error 6 in a.out[400000+1000]

[ 227.437065] a.out[1989]: segfault at 0 ip 0000000000400571 sp 00007ffcfd01c8c0 error 6 in a.out[400000+1000]

[root@VM-16-9-centos c++]#

[root@VM-16-9-centos c++]# addr2line -e a.out 0000000000400571

/root/c++/main.cpp:6

先通过dmesg找到对应出错的地址,再用 addr2line -e 将地址解析到对应的代码行。

gdb调试

gdb 想必大家都有听说,Linux 下面一款常用的的调试工具。

gdb 编译器通常以 gdb 命令的形式在终端中使用,下面学习下常用调试选项。

bt :查看堆栈信息

i locals :查看当前程序栈的局部变量

i args :查看当前程序栈的参数

i catch :查看当前程序中栈帧的异常处理器

p a :打印变量的值

i register :查看当前寄存器的值

r :从运行程序至第一个断点,没有断点则一直运行完

quit :退出

gdb调试过程中,输入 r ,bt。r 是运行 a.out 文件,bt查看堆栈情况。

我们不需要执行 gdb a.out,这样就相当于重新运行了 a.out 文件。然而在实际开发中,有很多问题都是概率发生的,所以此方法不太实用。

linux下操作过程(省略部分 gdb 介绍信息):

[root@VM-16-9-centos c++]# gdb a.out core.1989

Reading symbols from /root/c++/a.out.。.done.

[New LWP 1989]

bCore was generated by `。/a.out‘。

Program terminated with signal 11, Segmentation fault.

#0 0x0000000000400571 in main () at main.cpp:6

6 *p=0;

Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64

(gdb) bt

#0 0x0000000000400571 in main () at main.cpp:6

(gdb)

直接执行 gdb a.out core.1989,不用 r 命令避免程序重复执行。使用 bt 命令,可以看到程序出错代码行。

strace+addr2line调试

strace 是一个集诊断、调试、统计与一体的工具,我们可以使用strace,对应用的系统调用和信号传递的跟踪结果,来对应用进行分析,以达到解决问题,或者是了解应用工作过程的目的。

strace 的简单的用法就是,执行一个指定的命令,在指定的命令结束之后,它也就退出了。

在命令执行的过程中,strace 会记录和解析命令进程的所有系统调用,以及这个进程所接收到的,所有的信号值。

-c ,统计每一系统调用的所执行的时间,次数和出错的次数等

-p ,指定进程pid

-i ,输出系统调用的入口指针

linux 下操作过程(省略部分加载信息):

[root@VM-16-9-centos c++]# strace -i 。/a.out

[00007f79d3573847] munmap(0x7f79d3772000, 31038) = 0

[0000000000400571] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---

[????????????????] +++ killed by SIGSEGV (core dumped) +++

Segmentation fault

[root@VM-16-9-centos c++]# addr2line -e a.out 0000000000400571

/root/c++/main.cpp:6

絮叨

linux 调试技巧很重要,平时用到的也会很多,掌握好这些很关键。通过这篇文章,希望读者能对 core dump 调试有大致了解。 编辑:lyn

原文标题:linux 下调试 core dump 方式汇总,工作必备技能

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

扫一扫,分享给好友

复制链接分享 评论

发布评论请先 登录

相关推荐

使用hb set对源码进行设置版本时出错该如何解决 使用hb set对源码进行选定版本,选定为ipcamera_hispark_taurus_linux,出现[OHOS ERROR] invalid path的错 使用的源码... 发表于 03-25 10:52 • 251次 阅读 Linux开源社区宣布未来会把内核C语言版本升级到C11   还在使用89年版C语言的Linux内核,现在终于要做出改变了。 的头像 Linux爱好者 发表于 03-24 14:59 • 529次 阅读 卸载DevEco Device Tool的方法 需要安装脚本即,无论是Windows Linux平台,开发者在执行安装时,都会先行进行卸载操作,开发者单独执行卸载操作。 对于有特殊... 发表于 03-24 10:06 • 297次 阅读 ARM-Linux应用开发和单片机开发的不同 针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发。针对不同种.... 的头像 嵌入式ARM 发表于 03-23 16:01 • 335次 阅读 RT-Thread能否终止正执行的命令?是怎么操作的? 我一直有个问题,像这种一直运行任务,没有什么命令可以终止任务 我看RT-Thread, msh其本是操作很多命令基本与Linux的shell... 发表于 03-23 14:17 • 378次 阅读 鸿蒙内核实现用户态快速互斥锁Futex设计资料合集 Futex(Fast userspace mutex,用户态快速互斥锁),系列篇简称 快锁 ,是一个在 Linux 上实现锁定和构建高级抽象锁如信号量和... 发表于 03-23 14:12 • 144次 阅读 怎样在Ubuntu系统上下载和安装一些软件呢 Select lightdm 在这个逐步的教程中学习如何在 Ubuntu 上安装 Budgie 桌面。在所有各种 Ubuntu 版本中,Ubuntu Budgie... 发表于 03-22 11:42 • 548次 阅读 昉星光开发板介绍 昉·星光基于RISC-V架构,搭载JH7100视觉处理芯片,使开源达到更高的水平,开发者从而得到更大的自由及更强的能力去创新和... 发表于 03-21 17:46 • 1761次 阅读 昉惊鸿7100芯片 datasheet 发表于 03-21 17:43 • 1759次 阅读 昉星光单板计算机产品手册 发表于 03-21 17:36 • 1289次 阅读 盘点 5 款值得收藏的 Linux 开发板 [quote]导读:我给大家整理了 5 款值得收藏的 Linux 开发板,有些已经涨价很多了。至于未来还能不能继续“理财”,大家自行判断... 发表于 03-21 15:54 • 1140次 阅读 盘点 5 款值得收藏的 Linux 开发板 SONiC正在成为云架构中领先的开放网络操作系统 SONIC是一个基于 Linux 的开源网络操作系统,能够在多个厂商的交换机和专用集成电路(ASIC.... 的头像 是德科技KEYSIGHT 发表于 03-20 13:16 • 325次 阅读 ADI为Linux发行版扩充器件驱动 Ti Group选择是德科技5G测试平台 Keysight Technologies, Inc.(纽约证券交易所代码:KEYS)是一家领先的技.... 发表于 03-18 14:51 • 1287次 阅读 关于Linux命令行烧写固件 说明:如果已经安装旧版本的烧写工具,请先点击“驱动卸载”按钮下载驱动,然后再点击 “驱动安装”按钮安.... 的头像 HarmonyOS官方合作社区 发表于 03-18 10:57 • 188次 阅读 i.MX6ULL驱动开发3—GPIO寄存器配置原理 介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程。 的头像 码农爱学习 发表于 03-18 08:17 • 252次 阅读 i.MX6ULL驱动开发3—GPIO寄存器配置原理 Hi3861开发板串口看不到命令行是为什么?   1)开发板启动,只有教程中的AT命令能使用,敲回车报ERROR;   2)开发板没有linux常用命令吗(ls、pwd、cd)?还... 发表于 03-17 15:41 • 982次 阅读 i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC 本篇主要介绍了Linux移植的系统打包烧录的EMMC的方法,使用MfgTool工具,将**uboot.... 的头像 码农爱学习 发表于 03-17 09:17 • 1811次 阅读 i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC 一文深入理解操作系统的进程调度 想深入理解操作系统的进程调度,需要先获得一些准备知识,这样后面就不懵圈啦: 的头像 Linux爱好者 发表于 03-16 10:58 • 210次 阅读 如何鉴别Linux服务器是否被入侵 随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至.... 的头像 马哥Linux运维 发表于 03-16 10:08 • 268次 阅读 Linux namespace和cgroups简介 先放结论,namespace 是用来做资源隔离, cgroup 是用来做资源限制。 的头像 马哥Linux运维 发表于 03-16 09:03 • 260次 阅读 基础的Linux操作命令 IC设计是在linux环境下,很多操作需要在Terminal中进行,因此想要学习IC设计,就必须先需.... 的头像 FPGA之家 发表于 03-15 13:42 • 190次 阅读 BPF系统调用与Tracing类型的BPF程序 既然是提供向内核注入代码的技术,那么安全问题肯定是重中之重。平时防范他人通过漏洞向内核中注入代码,这.... 的头像 Linux阅码场 发表于 03-14 16:42 • 397次 阅读 盘点5款值得收藏的Linux开发板 最近股市又哀鸿遍野……于是,那句 “树莓派是最好的理财产品”又开始在我耳边萦绕。“缺芯”笼罩之下,开.... 的头像 话说科技 发表于 03-14 15:12 • 407次 阅读 盘点5款值得收藏的Linux开发板 霍尼韦尔智能楼宇技术助力小镇建设_ADI为Linux发行版扩充1000多个器件驱动  2022年2月11日,中国北京——霍尼韦尔宣布与中建二局安装工程有限公司和北京市设备安装工程集团有.... 的头像 电子魔法师 发表于 03-14 15:04 • 680次 阅读 i.MX6ULL嵌入式Linux开发5-根文件系统完善 上篇文章,使用BusyBox构建了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但.... 的头像 码农爱学习 发表于 03-14 08:44 • 219次 阅读 i.MX6ULL嵌入式Linux开发5-根文件系统完善 i.MX6ULL嵌入式Linux开发4-根文件系统构建 本篇使用BusyBox来构建根文件系统,并通过NFS网络调试的方式实现根文件系统挂载测试,实测时解决.... 的头像 码农爱学习 发表于 03-14 08:41 • 247次 阅读 i.MX6ULL嵌入式Linux开发4-根文件系统构建 i.MX6ULL嵌入式Linux开发3-Kernel移植 本文进行Linux内核的移植。 的头像 码农爱学习 发表于 03-14 08:36 • 250次 阅读 i.MX6ULL嵌入式Linux开发3-Kernel移植 提高Linux服务器性能的20个技巧  Linux功能丰富、强大、灵活,你可以用它完成各种任务,在这篇文章中,我们将讨论一些提高Linux.... 的头像 Linux爱好者 发表于 03-11 10:14 • 221次 阅读 51点灯与Linux驱动点灯的区别 嵌入式初学者入门的第一个“项目”就是LED点灯,那么,本文带你看看51、STM32、Linux点灯有.... 的头像 strongerHuang 发表于 03-10 17:37 • 1486次 阅读 为VisionFive星光板上创建Debian系统镜像 在RISC-V 星光板VisionFive上创建Debian/Linux系统 发表于 03-09 20:52 • 14次 阅读 为VisionFive星光板上创建Debian系统镜像 Linux内核代码修改将为性能测试获8450%提升 Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随.... 的头像 马哥Linux运维 发表于 03-09 14:16 • 260次 阅读 Linux私房菜基础篇-第三版 Linux私房菜基础篇-第三版免费下载。 发表于 03-07 16:46 • 53次 阅读 《Linux命令行大全》(英文版) [美]William E. Shotts Jr. 著 发表于 03-07 16:29 • 26次 阅读 i.MX6ULL嵌入式Linux开发2-uboot移植实践 上篇文章,我们介绍了如何使用NXP原厂的uboot进行编译和烧写,将uboot运行在自己的开发板上。.... 的头像 码农爱学习 发表于 03-07 09:00 • 1740次 阅读 i.MX6ULL嵌入式Linux开发2-uboot移植实践 i.MX6ULL嵌入式Linux开发1-uboot移植初探 本系列教程以i.MX6ULL处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与.... 的头像 码农爱学习 发表于 03-07 08:57 • 1297次 阅读 i.MX6ULL嵌入式Linux开发1-uboot移植初探 万象奥科RZ G2L核心板高低温测试 评估测试RZ/G2L核心板环境适应性,测试低温启动、高温工作、高低温循环状态下的工作情况。 的头像 武汉万象奥科 发表于 03-03 15:27 • 10次 阅读 万象奥科RZ G2L核心板高低温测试 RZ G2L核心板以太网接口性能测试 武汉万象奥科RZ/G2L核心板支持2路千兆以太网接口,评估测试RZ/G2L双网口实际传输速率。 的头像 武汉万象奥科 发表于 03-03 14:04 • 10次 阅读 RZ G2L核心板以太网接口性能测试 RZ/G2L核心板功耗测试 测试RZ/G2L核心板静态功耗与CPU满负载时的负载功耗,辅助产品设计中的散热方案评估。 的头像 武汉万象奥科 发表于 03-03 11:35 • 9次 阅读 RZ/G2L核心板功耗测试 linux常用命令大全 linux常用命令大全,一些常用的命令都可以找到 发表于 03-03 09:20 • 54次 阅读 为什么要在汽车上使用SOA架构 整车E/E架构升级,硬件架构上从分布式ECU向域集中式,进一步向中央集中式+区域控制器升级; 发表于 03-02 09:15 • 115次 阅读 为什么要在汽车上使用SOA架构 瑞萨电子推出64位RISC-V CPU内核RZ/Five通用MPU,开创RISC-V技术先河 瑞萨电子今日宣布,推出基于64位RISC-V CPU内核的RZ/Five通用微处理器(MPU)——R.... 发表于 03-01 13:54 • 628次 阅读 瑞萨电子推出64位RISC-V CPU内核RZ/Five通用MPU,开创RISC-V技术先河 keil5+STM32F103C8T6设计的智能插座+人体感应灯 支持跨平台编译运行 这是基于STM32设计的智能插座+人体感应灯。SRM32F103C8T6最小系统板、红外热释电人体感.... 的头像 DS小龙哥-嵌入式技术 发表于 02-28 13:19 • 2140次 阅读 keil5+STM32F103C8T6设计的智能插座+人体感应灯 支持跨平台编译运行 迅为iTOP-STM32MP157开发板 迅为ITOP-STM32MP157是基于ST的STM32MP157芯片开发的一款开发平台。在STM3.... 发表于 02-23 14:43 • 18次 阅读 迅为STM32MP157开发板入门教程之外设功能验证 迅为STM32MP157开发板入门教程之外设功能验证 的头像 平常心0 发表于 02-23 14:16 • 27次 阅读 迅为STM32MP157开发板入门教程之外设功能验证 国产平台T3如何快速部署电力能源神器-Docker容器 前 言随着电网数据信息化的深入,电网的各种应用服务增长迅速,原有应用服务部署方式面临着资源利用率低、.... 的头像 Tronlong创龙科技 发表于 02-17 13:56 • 24次 阅读 国产平台T3如何快速部署电力能源神器-Docker容器 Petalinux2020.01 内核DMA驱动调试说明 Petalinux2020.01 内核DMA驱动调试过程分享 的头像 赛灵思 发表于 02-16 16:21 • 179次 阅读 为什么要用C语言实现面向对象   不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,.... 的头像 硬件攻城狮 发表于 02-16 16:19 • 441次 阅读 为什么要用C语言实现面向对象 Linux编程入门 Linux编程入门 发表于 02-16 14:55 • 66次 阅读 如何配置和操作Linux驱动程序开发板 本文档概述了利用Linux开发板为 Linux 内核开发驱动程序的基础知识,并简单介绍了如何配置和操.... 的头像 德州仪器 发表于 02-15 13:36 • 402次 阅读 如何配置和操作Linux驱动程序开发板 选型必备!最新最全的工业核心板目录大全来了!! 随着嵌入式技术的发展,越来越多的处理器应运而生。除了国外的主流半导体厂家,国内的半导体厂家也异军突起.... 的头像 Tronlong创龙科技 发表于 02-15 09:30 • 25次 阅读 选型必备!最新最全的工业核心板目录大全来了!! 一文详细了解五种IO模型 五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。 的头像 硬件攻城狮 发表于 02-14 14:38 • 559次 阅读 一文详细了解五种IO模型 Linux总线、设备、驱动模型的探究 Linux总线、设备、驱动模型的探究 发表于 02-14 12:01 • 65次 阅读 Cortex-M可以跑Linux操作系统吗? ARM处理器的体系结构定义了指令集(ISA)和基于这一体系结构下处理器的模型。ARM的指令集从ARM.... 发表于 02-08 15:55 • 42次 阅读 Cortex-M可以跑Linux操作系统吗? 51、STM32、Linux点灯有什么区别? 嵌入式初学者入门的第一个“项目”就是LED点灯,那么,本文带你看看51、STM32、Linux点灯有.... 发表于 02-08 15:32 • 105次 阅读 51、STM32、Linux点灯有什么区别? U-Boot架构浅析 导读:嵌入式Linux系统搭建,bootloader是必不可少的一环,而U-Boot已成嵌入式Lin.... 发表于 02-07 11:56 • 57次 阅读 U-Boot架构浅析 深度解析U-Boot网络实现 对于U-Boot而言,并没有完整的实现上述模型,u-boot需要控制固件的尺寸,所以根据需要做了一些.... 发表于 02-07 11:53 • 50次 阅读 深度解析U-Boot网络实现 阅读内核系列之内核调度器为何全局导出 [导读] Linux内核代码庞大,阅读内核书籍总觉得云山雾绕,纸上得来终觉浅,希望通过阅读代码撰写笔.... 发表于 02-07 11:49 • 42次 阅读 阅读内核系列之内核调度器为何全局导出 关于MMU那些事儿 如果我们一直是单任务处理,则不会有任何问题,也或者应用程序所需的内存总是非常小,则这种架构是不会有任.... 发表于 02-07 11:27 • 40次 阅读 关于MMU那些事儿 如何使用v4l2 API读取摄像头 V4L2是Video For Linux的第二个版本,它是Linux的视频捕获的API。在这里,您可.... 发表于 02-07 11:16 • 30次 阅读 如何使用v4l2 API读取摄像头 上古神器vim系列之初探 [导读] 一直以来VIM也用一些,但是用的不熟,最近看了些文章,发现这个东西有必要发大力气系统的练习.... 发表于 02-07 11:13 • 52次 阅读 上古神器vim系列之初探 AM4379 AM437x ARM Cortex-A9 微处理器 (MPU) TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等... 发表于 09-25 11:51 • 536次 阅读 AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3